//package com.wjm.blog.core.filter;
//
//import cn.hutool.core.exceptions.ExceptionUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.alibaba.fastjson.JSON;
//import com.auth0.jwt.JWT;
//import com.auth0.jwt.JWTCreator;
//import com.auth0.jwt.JWTVerifier;
//import com.auth0.jwt.algorithms.Algorithm;
//import com.auth0.jwt.exceptions.JWTCreationException;
//import com.auth0.jwt.exceptions.JWTVerificationException;
//import com.auth0.jwt.interfaces.DecodedJWT;
//import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
//import com.wjm.blog.common.base.SysRoleResourcSimpleVo;
//import com.wjm.blog.common.base.SysUserDetailVo;
//import com.wjm.blog.common.enums.CommonEnum;
//import com.wjm.blog.common.util.IpUtil;
//import com.wjm.blog.common.util.ServletUtils;
//import com.wjm.blog.core.redis.RedisUtils;
//import com.wjm.blog.core.redis.RequestUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import java.util.Date;
//import java.util.List;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//
///**
// * token工具类（生成、验证）
// *
// * @author QAQ
// * @version 1.0
// * @date 2021/6/30 11:40
// */
//@Slf4j
//@Component
//public class TokenUtils {
//
//    //密钥盐
//    private static final String TOKEN_SECRET = "jwt";
//
//    //保存用户信息的key
//    private static final String USER_INFO_KEY = "USER_INFO_KEY";
//
//    private static final String TOKEN_MD5 = "LOGIN_CODE:MD5:";
//
//    private static long flushTime;
//
//    public long getFlushTime() {
//        return flushTime;
//    }
//
//    @Value("${flushTime:864000}")
//    public void setFlushTime(long flushTime) {
//        this.flushTime = flushTime;
//    }
//
//    /**
//     * @param user
//     * @return
//     * @Description 生成token
//     */
//    public static String sign(SysUserDetailVo user) {
//        return sign(user, 12 * 3600 * 1000L);
//    }
//
//    /**
//     * @param user       用户信息
//     * @param expireTime 过期毫秒数
//     * @return
//     * @Description 生成token
//     */
//    public static String sign(SysUserDetailVo user, Long expireTime) {
//
//        String token = null;
//        try {
//            Date expireAt = new Date(System.currentTimeMillis() + expireTime);
//
//            JWTCreator.Builder builder = JWT.create();
//            builder.withIssuer("auth");
//            builder.withClaim("user", JSON.toJSONString(user));
//            if (ObjectUtil.isNotEmpty(user.getId())) {
//                builder.withClaim("userId", user.getId().toString());
//            }
//
//            if (StrUtil.isNotEmpty(user.getUserAccount())) {
//                builder.withClaim("userAccount", user.getUserAccount());
//            }
//
//            if (ObjectUtil.isNotEmpty(user.getPdaId())) {
//                builder.withClaim("pdaId", JSON.toJSONString(user.getPdaId()));
//            }
//            builder.withExpiresAt(expireAt);  //设置过期时间
//            token = builder.sign(Algorithm.HMAC256(TOKEN_SECRET));
//
//        } catch (IllegalArgumentException | JWTCreationException je) {
//
//        }
//        return token;
//    }
//
//
//    /**
//     * @Description ：token验证
//     */
//    public static boolean verify(String token) {
//
//        try {
//            //空数据
//            if (StrUtil.isEmpty(token)) {
//                //默认用户是否存在
//                Object initUser = RedisUtils.get("initUser");
//                if (initUser == null) {
//                    return false;
//                }
//
//                SysUserDetailVo userDetailVo = JSON.parseObject(String.valueOf(initUser), SysUserDetailVo.class);
//                RequestUtil.getRequest().setAttribute("userDetailVo", userDetailVo);
//
//                return true;
//            }
//
//            SysUserDetailVo sysUserDetailVo = platformVerifyToken(token);
//            if (ObjectUtil.isNull(sysUserDetailVo)) {
//                return false;
//            }
////            ServletUtils.setAttribute(USER_INFO_KEY, sysUserDetailVo);
////            ServletUtils.setAttribute("userDetailVo", sysUserDetailVo);
//            RequestUtil.getRequest().setAttribute("userDetailVo", sysUserDetailVo);
//            // 将当前登录人信息, 注入到请求属性中
//            return true;
//
//        } catch (IllegalArgumentException | JWTVerificationException e) {
//            log.error(ExceptionUtil.stacktraceToString(e));
//        } catch (Exception e) {
//            log.error(ExceptionUtil.stacktraceToString(e));
//        }
//        return false;
//    }
//
//    /**
//     * @param token
//     * @description: 平台验证方法，校验原始token
//     * @author: wang.shouyan
//     * @date: 2023/3/2 15:59
//     * @return:
//     **/
//    private static SysUserDetailVo verifyToken(String token) throws Exception {
//        String ip = IpUtil.getIp(ServletUtils.getRequest());
//
//        try {
//            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("jwt")).withIssuer(new String[]{"auth"}).build();
//            DecodedJWT decodedJWT = jwtVerifier.verify(token);
//            String user = decodedJWT.getClaim("user").asString();
//            SysUserDetailVo userEntity = (SysUserDetailVo) JSON.parseObject(user, SysUserDetailVo.class);
//            if (CollectionUtils.isNotEmpty(userEntity.getDetailVos())) {
//                List<Long> roleIds = (List) userEntity.getDetailVos().stream().map(SysRoleResourcSimpleVo::getRoleId).collect(Collectors.toList());
//                userEntity.setRoleIds(roleIds);
//            }
//
//            if (userEntity == null) {
//                return null;
//            } else {
//                Object o = RedisUtils.get("LOGIN_CODE:" + userEntity.getUserAccount());
//                Long clientId = Long.valueOf(userEntity.getClientId());
//                //1.5 版本
//                if (o != null && userEntity.getClientId() != null && userEntity.getClientId().equals(Long.valueOf(o.toString()))) {
//                    RedisUtils.expire("LOGIN_IP:" + ip + "_" + token, flushTime, TimeUnit.MILLISECONDS);
//                    RedisUtils.expire("LOGIN_CODE:" + userEntity.getUserAccount(), flushTime, TimeUnit.MILLISECONDS);
//                    return userEntity;
//                } else {
//                    //1.4 版本验证
//                    o = RedisUtils.get(CommonEnum.Request.LOGIN_CODE + userEntity.getUserAccount());
//                    if (o == null || clientId == null || !clientId.equals(Long.valueOf(o.toString()))) {
//                        return null;
//                    } else {
//                        return userEntity;
//                    }
//                }
//            }
//        } catch (JWTVerificationException | IllegalArgumentException var8) {
//            log.debug("JWT TOKEN, 验证不通过", var8);
//            return null;
//        } catch (Exception var9) {
//            log.error("JWT TOKEN 解析异常", var9);
//            return null;
//        }
//    }
//
//    private static SysUserDetailVo platformVerifyToken(String token) throws Exception {
//        Object md5Token = RedisUtils.get(TOKEN_MD5 + token);
//        if (md5Token != null) {
//            return verifyToken(String.valueOf(md5Token));
//        }
//        return verifyToken(token);
//    }
//
//    /**
//     * @return
//     * @Description 获取登录用户信息
//     */
//    public static SysUserDetailVo getUserDetail() {
//        return (SysUserDetailVo) ServletUtils.getAttribute(USER_INFO_KEY);
//    }
//
//
//}
//
